VERSION = 3.00)MS Sans Serif, 0, 8, 5, 13, 11, 11, 2, 0 _qbfPixelsClass4Pixels _container_qbf_data.hM(!Arial, 0, 9, 5, 15, 12, 32, 3, 0  _conflicts_data.hPixelsClass10_form _conflicts _conflicts lblConflicts_data.hJ_# F:%xU&G(#)T- UTHISENABLEDTHISFORMREFRESHClick,1cQ1s)_qbfcmdClearFilter commandbutton _base.vcx_commandbutton_qbf _base.vcx_offline cmdExecuteQBF commandbutton_qbf_data.h^hE*!Arial, 0, 9, 5, 15, 12, 32, 3, 0 _data.hClass2 _container_offlinePROCEDURE Option1.Click THIS.Parent.Parent.GoOnline() ENDPROC PROCEDURE Option2.Click THIS.Parent.Parent.GoOffline() ENDPROC _offline ogOfflinecustomdCaption = "Conflicts on row:" Height = 17 Left = 8 Top = 17 Width = 158 Name = "lblConflicts" labellabel3PROCEDURE Click THISFORM.NextConflict ENDPROC  _conflicts~PROCEDURE Click *!* Clear the filter that was set SET FILTER TO GO TOP THIS.enabled = .F. THISFORM.Refresh ENDPROC _commandbutton cmdQBFMode commandbutton _base.vcx_commandbutton container1_data.h1AutoSize = .F. Top = 71 Left = 4 Height = 23 Width = 72 FontBold = .F. FontName = "MS Sans Serif" FontSize = 8 Caption = "\.% TCC  % FC  FQC  %CC9CCould not open following view: C  x Ta!TCQC  % C QC7A record conflict occured during the update with view: C  x Ta!TCC  % QC  %  [6CFailed to take online view: C  x Ta!% T 4C$View were successfully taken online.  F ULUPDATESUCCESS LDROPSUCCESS AUPDATEERRORSILABORT LALREADYUSED NSAVEAREATHIS CDATABASECVIEWSALERT LUPDATEVIEWS OGOFFLINEVALUEK ,%C CDATABASEv FG("%C CC T-T-BTaTa(C!+TCC VIEWOFFLINE% !#T C 6U LOFFLINEITHIS CDATABASECVIEWS OGOFFLINEOPTION1ENABLEDOPTION2VALUER, UCMESSAGE%  ,%C CDATABASEv cG(TCVIEW%C UTHIS LALLVIEWS ATMPVIEWS NTOTVIEWS CDATABASECVIEWSW% C 6TCDATABASEv C CUTHISLUSECURRENTDBC CDATABASESETVIEWS CHECKOFFLINE gooffline,goonlineg checkofflinealertrsetviewsInit 1Ab1qAAAQaA1qAAAR3QaAb1AAAAAAaAA1Q1AAAAAaAAA1AA3A"BAAABAAAA23q!2A1AA3A2s!QJ bdf }g @ t[ )$  PROCEDURE gooffline LOCAL i,j IF !EMPTY(THIS.cDatabase) AND (SET("DATABASE") # THIS.cDatabase) SET DATABASE TO (THIS.cDatabase) ENDIF IF EMPTY(THIS.cViews[1]) THIS.Alert(C_NOVIEWS_LOC) RETURN .F. ENDIF FOR i = 1 TO ALEN(THIS.cViews) * Check if already offline IF DBGETPROP(THIS.cViews[m.i],"VIEW","OFFLINE") LOOP ENDIF IF !CREATEOFFLINE(THIS.cViews[m.i]) THIS.Alert(C_FAILOFFLINE_LOC+THIS.cViews[m.i]) IF THIS.lRevertOnFail FOR j = 1 TO i-1 DROPOFFLINE(THIS.cViews[m.i]) ENDFOR THIS.ogOffline.value = 1 RETURN .F. ENDIF ENDIF ENDFOR THIS.Alert(C_OKOFFLINE_LOC) ENDPROC PROCEDURE goonline LOCAL lUpdateSuccess,lDropSuccess,aUpdateErrors[1],i,lAbort,lAlreadyUsed,nSaveArea lAbort = .F. DIMENSION THIS.aUpdateErrors[1] THIS.aUpdateErrors[1] = 0 IF !EMPTY(THIS.cDatabase) AND (SET("DATABASE") # THIS.cDatabase) SET DATABASE TO (THIS.cDatabase) ENDIF IF EMPTY(THIS.cViews[1]) THIS.Alert(C_NOVIEWS_LOC) RETURN ENDIF nSaveArea = SELECT() FOR i = 1 TO ALEN(THIS.cViews) * Check if already online IF !DBGETPROP(THIS.cViews[m.i],"VIEW","OFFLINE") LOOP ENDIF IF THIS.lUpdateViews lAlreadyUsed = USED(THIS.cViews[m.i]) IF m.lAlreadyUsed SELECT (THIS.cViews[m.i]) ELSE SELECT 0 ENDIF USE (THIS.cViews[m.i]) ONLINE EXCLUSIVE IF EMPTY(ALIAS()) * Failed to open exclusively MESSAGEBOX(C_NOOPEN_LOC+THIS.cViews[m.i]) lAbort = .T. EXIT ENDIF lUpdateSuccess = TableUpdate(2,aUpdateErrors) USE IN (THIS.cViews[m.i]) IF !m.lUpdateSuccess ACOPY(aUpdateErrors,THIS.aUpdateErrors) MESSAGEBOX(C_RECORDCONLICT_LOC+THIS.cViews[m.i]) lAbort = .T. EXIT ENDIF ENDIF lDropSuccess = DROPOFFLINE(THIS.cViews[m.i]) IF m.lAlreadyUsed USE (THIS.cViews[m.i]) ENDIF IF !m.lDropSuccess MESSAGEBOX(C_FAILONLINE_LOC+THIS.cViews[m.i]) lAbort = .T. EXIT ENDIF ENDFOR IF m.lAbort THIS.ogOffline.value = 2 ELSE THIS.Alert(C_OKONLINE_LOC) ENDIF SELECT (m.nSaveArea) ENDPROC PROCEDURE checkoffline LOCAL lOffline,i IF !EMPTY(THIS.cDatabase) AND (SET("DATABASE") # THIS.cDatabase) SET DATABASE TO (THIS.cDatabase) ENDIF IF EMPTY(THIS.cDatabase) OR EMPTY(THIS.cViews[1]) *THIS.Alert(C_NODATABASE_LOC) THIS.ogOffline.Option1.Enabled = .F. THIS.ogOffline.Option2.Enabled = .F. RETURN ENDIF THIS.ogOffline.Option1.Enabled = .T. THIS.ogOffline.Option2.Enabled = .T. FOR i = 1 TO ALEN(THIS.cViews) lOffline = DBGETPROP(THIS.cViews[m.i],"VIEW","OFFLINE") IF !lOffline EXIT ENDIF ENDFOR THIS.ogOffline.value = IIF(m.lOffline,2,1) ENDPROC PROCEDURE alert LPARAMETER cMessage WAIT WINDOW m.cMessage TIMEOUT 2 ENDPROC PROCEDURE setviews * Abstract class to setup THIS.cViews array and THIS.cDatabase (optional) IF THIS.lAllViews LOCAL aTmpViews,nTotViews DIMENSION aTmpViews[1] IF !EMPTY(THIS.cDatabase) AND (SET("DATABASE")#THIS.cDatabase) SET DATABASE TO (THIS.cDatabase) ENDIF nTotViews = ADBOBJECT(aTmpViews,"VIEW") IF nTotViews>0 DIMENSION THIS.cViews[1] ACOPY(aTmpViews,THIS.cViews) ENDIF ENDIF ENDPROC PROCEDURE Init IF THIS.lUseCurrentDBC AND EMPTY(THIS.cDatabase) THIS.cDatabase = SET("DATABASE") ENDIF THIS.SetViews() THIS.CheckOffline() ENDPROC _execsp_data.h.M(  %ShbU CUTHISFORMRELEASEClick,12%)XTop = 149 Left = 406 Height = 23 Width = 72 Caption = "\ "U" THEN IF !EMPTY(THISFORM.Controls(nCnt).ControlSource) AND ; TYPE('THISFORM.Controls(nCnt).value') <> "U" THEN *!* Now we need to parse the value property into a proper *!* condition using the parseCondition method of the form cCondition = THIS.Parent.parseCondition(THISFORM.Controls(nCnt).value,THISFORM.Controls(nCnt).controlSource) *!* If there is a condition, add it to are overall filter IF !EMPTY(cCondition) THEN cFilter = cFilter + " AND " + cCondition ENDIF ENDIF ENDIF ENDFOR *!* We need to rollback the transaction to discard the APPEND'ed record ROLLBACK THIS.Enabled = .F. THIS.Parent.cmdQBFMode.Enabled = .T. *!* This removes the " AND " keyword that is not needed for the *!* first condition added to cFilter IF !EMPTY(cFilter) THEN cFilter = ALLTRIM(SUBSTRC(cFilter,5)) ENDIF *!* Now we are ready to apply the filter SET FILTER TO &cFilter THIS.Parent.cmdClearFilter.enabled = .T. GO TOP THISFORM.Refresh ENDPROC _commandbutton TD%XgU%C=$R,No cursor specified.B-TC-a C% CUpdate succeded:C*Update failed, the primary key has changed UTHISFORM CURSORALIASLLUPDATE CHECKSOURCEALERT NEXTCONFLICTClick,1!AqArA2)PROCEDURE Click IF EMPTY(THISFORM.CursorAlias) WAIT WINDOW CS_NOALIAS_LOC TIMEOUT 2 RETURN .F. ENDIF LOCAL llUpdate * force-update current row llUpdate = TABLEUPDATE(.F., .T.) THISFORM.CheckSource() * Display whether update was successful or failed (e.g., primary key changed) IF m.llUpdate THISFORM.Alert(WAIT_UPDATEOK_LOC) ELSE THISFORM.Alert(WAIT_UPDATEFAIL1_LOC) ENDIF THISFORM.NextConflict ENDPROC ZTop = 149 Left = 190 Height = 23 Width = 72 Caption = "\QC_ TCO T4T Conflicts on row: CC ZA%OCC No conflicts found.No more conflicts found.6 C B- F#)! (C/3>C CC _% [CH! (C3>C CC H! (C%&T.C >C C#)  FU LNSTARTROWLNROW LCUSERFIELD LNBUFFERING NCURSORTYPELNFIELDSITHIS CURSORALIASALERTTHISFORMRELEASE LBLCONFLICTSCAPTION CONFLICTALIAS ACONFLICTS GRDCONFLICTSREFRESHP%CC C 1TC%Cr$CNo cursor specified.B- CC Fh _conflictsTCTT a%C :T aIB-U ATMPCONFLICTSTHIS CURSORALIASALERT ACONFLICTS _CONFLICTS CONFLICTALIAS GRDCONFLICTS RECORDSOURCEVISIBLE NEXTCONFLICTTHISFORMR, UCMESSAGE CUTHISFORMRELEASEb%CC C *TC%[%C WB-UTHIS CURSORALIAS LAUTOCHECK STARTCHECKg%C C 0 FQ%C C ` FUTHISFORM CONFLICTALIAS CURSORALIAS nextconflict, startcheck8alert QueryUnloadCInitjRelease1q"AqAAqAqAb1AAABqAQ1A5QAB1ACaAR3qA"AqA1qSQQbCqA3q!32A!qAA2AAA2?Q YYm ~\ ^ g )p Vccursorname hconnecthandle csql cspname aparams setsql setparams processerror jdisplay_column Specifies the column from lookup_table to display in the drop down list. lookup_table Specifies the table to lookup the values to display in the drop down. return_column Specifies the column value to return the value property of the combo box. order_column Specifies the column to order the records displayed in the drop down list (optional). Height = 183 Width = 490 DoCreate = .T. AutoCenter = .T. Caption = "Resolve Conflicts" MaxButton = .F. MinButton = .F. WindowType = 1 AlwaysOnTop = .T. conflictalias = cursoralias = lautocheck = .T. Name = "_conflicts" Width = 119 Height = 64 BackStyle = 0 BorderWidth = 0 lrevertonfail = .T. lupdateviews = .T. lusecurrentdbc = .T. Name = "_offline" ccursorname hconnecthandle csql cspname lusesqlsyntax Use SQL Server Exec syntax. *dosql Runs SPT statement. ^aparams[1,0] *setsql *setparams *processerror *getsql Gets results from SPT statement. aFontName = "MS Sans Serif" FontSize = 8 Height = 23 Width = 175 Name = "_cbodistinctvalues" PROCEDURE Destroy LOCAL cCursor cCursor = "c" + THIS.name IF USED(m.cCursor) THEN USE IN &cCursor ENDIF ENDPROC PROCEDURE Init LOCAL cSQL, cAlias, cColumn IF !EMPTY(THIS.controlSource) THEN IF NOT "." $ THIS.controlSource THEN =MESSAGEBOX(NO_TABLE_LOC) ELSE cAlias = LEFTC(THIS.controlSource,(ATC(".",THIS.controlSource)-1)) cColumn = RIGHTC(THIS.controlSource,(LENC(THIS.controlSource)-ATC(".",THIS.controlSource))) IF INLIST(TYPE(m.cAlias+"."+m.cColumn),"D","T","M","G","L") RETURN ENDIF THIS.rowSourceType = 3 cSQL = "SELECT DISTINCT " + m.cColumn + " FROM " + m.cAlias + ; " INTO CURSOR c" + THIS.name THIS.rowSource = m.cSQL ENDIF ENDIF ENDPROC ) %wU  %C cConditionbCCTCTCC.%C %C cConditionbCM1%< == LIKE <> != # = >= <= > -T%C HQ CbCM$T = C" C"  CbDT T = {C*}2T = CZ T BU CCONDITIONCCONTROLSOURCELCRETCONDITION LCFIELDNAMEparsecondition,1AzAAQAQAAA1) O%,/UAT%C :USE IN &cAlias UCALIASTHISNAME H CAn invalid display column or return column has been specified in the 'display_column' or 'return_column' properties (combo box ).0x FkCOAn invalid column has been specified in the 'order_column' property (combo box ).0x  ~CbAn invalid table has been specified in the 'display_column' or 'lookup_table' property (combo box ).0x2CCE0xUNERRORCMETHODNLINETHISNAME  Ta H# CgCKA lookup table must be specified in the 'lookup_table' property (combo box ).0x T- C/kCOA display column must be specified in the 'display_column' property (combo box ).0x T- CiCMA return column must be specified in the 'return_column' property (combo box ).0x T- %%C >eTSELECT , FROM  ORDER BY  INTO CURSOR PTSELECT , FROM  INTO CURSOR TT T   U LOKNSQLTHIS LOOKUP_TABLENAMEDISPLAY_COLUMN RETURN_COLUMN ORDER_COLUMN ROWSOURCETYPE ROWSOURCE BOUNDCOLUMNREFRESHDestroy,ErrorInit1q!A3! !!A3!q!!A1QAA1gW rc)nPROCEDURE Destroy LOCAL cAlias cAlias = THIS.name IF USED(m.cAlias) THEN USE IN &cAlias ENDIF ENDPROC PROCEDURE Error LPARAMETERS nError, cMethod, nLine #DEFINE INVALID_COLUMN_LOC "An invalid display column or return column has been specified in the 'display_column' or 'return_column' properties (combo box " + THIS.name + ")." #DEFINE INVALID_TABLE_LOC "An invalid table has been specified in the 'display_column' or 'lookup_table' property (combo box " + THIS.name + ")." #DEFINE INVALID_SORT_LOC "An invalid column has been specified in the 'order_column' property (combo box " + THIS.name + ")." DO CASE CASE nError = 1806 =MESSAGEBOX(INVALID_COLUMN_LOC,48) CASE nError = 1808 =MESSAGEBOX(INVALID_SORT_LOC,48) CASE nError = 1802 =MESSAGEBOX(INVALID_TABLE_LOC,48) OTHERWISE =MESSAGEBOX(MESSAGE(),48) ENDCASE ENDPROC PROCEDURE Init LOCAL lOK, nSQL lOK = .T. DO CASE CASE EMPTY(THIS.lookup_table) =MESSAGEBOX(NO_LOOKUP_TABLE_LOC,48) lOK = .F. CASE EMPTY(THIS.display_column) =MESSAGEBOX(NO_DISPLAY_COLUMN_LOC,48) lOK = .F. CASE EMPTY(THIS.return_column) =MESSAGEBOX(NO_RETURN_COLUMN_LOC,48) lOK = .F. ENDCASE IF lOK THEN IF !EMPTY(THIS.order_column) nSQL = "SELECT " + THIS.display_column + "," + THIS.return_column + " FROM " + THIS.lookup_table + " ORDER BY " + THIS.order_column + " INTO CURSOR " + THIS.name ELSE nSQL = "SELECT " + THIS.display_column + "," + THIS.return_column + " FROM " + THIS.lookup_table + " INTO CURSOR " + THIS.name ENDIF THIS.RowSourceType = 3 THIS.RowSource = nSQL THIS.BoundColumn = 2 ENDIF THIS.Refresh ENDPROC  PROCEDURE nextconflict LPARAMETERS lnStartRow LOCAL lnRow, lcUserField, lnBuffering, nCursorType, lnFields, i IF EMPTY(THIS.CursorAlias) THIS.Alert(CS_NOALIAS_LOC) THISFORM.release() RETURN .F. ENDIF SELECT (THIS.CursorAlias) * default start row is current row IF PCOUNT() = 0 lnStartRow = RECNO() ENDIF * close form after single row conflicts lnBuffering = CURSORGETPROP('Buffering') IF lnBuffering = 1 THIS.Alert(CS_NOBUFFER_LOC) THISFORM.release() RETURN .F. ENDIF IF lnBuffering<4 AND lnStartRow#0 THISFORM.release() RETURN .F. ENDIF nCursorType = CURSORGETPROP("SourceType",THIS.CursorAlias) IF lnBuffering>3 * for table buffering move to next row lnRow = GETNEXTMODIFIED(lnStartRow,THIS.CursorAlias) IF lnRow # 0 GO lnRow IN (THIS.CursorAlias) ENDIF ELSE * handle row buffering lnFields = GETFLDSTATE(-1) IF REPLICATE("1",LEN(lnFields))#TRANS(lnFields) lnRow = RECNO() ELSE lnRow = 0 ENDIF ENDIF THIS.lblConflicts.caption = CS_ROWCONFLICT_LOC + LTRIM(STR(lnRow,10 , 0)) IF lnRow = 0 THIS.Alert(IIF(m.lnStartRow=0,CS_NOCONFLICTS1_LOC,CS_NOCONFLICTS_LOC)) THISFORM.Release() RETURN .F. ENDIF * load original values SELECT (THIS.ConflictAlias) GO TOP FOR m.i = 1 TO ALEN(THIS.aConflicts, 1) REPLACE (THIS.aConflicts[m.i,1]) WITH OLDVAL(THIS.aConflicts[m.i,1], THIS.CursorAlias) ENDFOR * load current values * add error code here IF m.nCursorType # 3 && refresh if not a table REFRESH(1, 0, THIS.CursorAlias) ENDIF SKIP FOR m.i = 1 TO ALEN(THIS.aConflicts, 1) REPLACE (THIS.aConflicts[m.i,1]) WITH CURVAL(THIS.aConflicts[m.i,1], THIS.CursorAlias) ENDFOR * load user values SKIP FOR m.i = 1 TO ALEN(THIS.aConflicts, 1) lcUserField = THIS.CursorAlias + '.' + THIS.aConflicts[m.i,1] REPLACE (THIS.aConflicts[m.i,1]) WITH EVALUATE(lcUserField) ENDFOR GO TOP THIS.grdConflicts.Refresh SELECT (THIS.CursorAlias) ENDPROC PROCEDURE startcheck LOCAL aTmpConflicts IF !EMPTY(ALIAS()) AND EMPTY(THIS.CursorAlias) THIS.CursorAlias = ALIAS() ENDIF IF EMPTY(THIS.CursorAlias) THIS.Alert(CS_NOALIAS_LOC) RETURN .F. ENDIF DIMENSION aTmpConflicts[1] DIMENSION THIS.aConflicts[1] AFIELDS(aTmpConflicts) ACOPY(aTmpConflicts,THIS.aConflicts) SELECT 0 CREATE CURSOR _conflicts FROM ARRAY aTmpConflicts THIS.ConflictAlias = ALIAS() * append conflict records APPEND BLANK APPEND BLANK APPEND BLANK THIS.grdConflicts.RecordSource = THIS.ConflictAlias THIS.grdConflicts.Visible = .T. * move on first conflict IF THIS.NextConflict(0) THISFORM.Visible = .T. ELSE RETURN .F. ENDIF ENDPROC PROCEDURE alert LPARAMETERS cMessage WAIT WINDOW m.cMessage TIMEOUT 2 ENDPROC PROCEDURE QueryUnload thisform.RELEASE() ENDPROC PROCEDURE Init IF !EMPTY(ALIAS()) AND EMPTY(THIS.CursorAlias) THIS.CursorAlias = ALIAS() ENDIF IF THIS.lAutoCheck IF !THIS.StartCheck() RETURN .F. ENDIF ENDIF ENDPROC PROCEDURE Release IF !EMPTY(THISFORM.ConflictAlias) AND USED(THISFORM.ConflictAlias) SELECT (THISFORM.ConflictAlias) USE ENDIF IF !EMPTY(THISFORM.CursorAlias) AND USED(THISFORM.CursorAlias) SELECT (THISFORM.CursorAlias) ENDIF ENDPROC s ZZe%2]UHTCi% A UNERRORTHISHCONNECTHANDLECSQL CCURSORNAME PROCESSERRORx%9)Texec  Cq0T{call (C)}UTHIS LUSESQLSYNTAXCSQLCSPNAME SETPARAMS  T(CyTC%CuT, BU NARRAYCOUNTCPARMSTHISAPARAMSE CzTC CxU CMESSAGETEXT ASQLERROR BUTHISCSQL"4%Ct i>C2You must pass at least 3 parameters to this class.xB-C %C T T %CtT sqlresultT  CUCSPNAMEHCONNECTHANDLEAPARAMS CCURSORNAMETHISSETSQLdosql,setsql setparamsb processerrorgetsqluInit1qA3A3a!AA2qA331qA1"!A"!A2d `0%KF))ZQPROCEDURE dosql LOCAL nError nError = SQLEXEC (this.hConnectHandle, this.cSQL, this.cCursorName) IF nError < 0 this.ProcessError ENDIF ENDPROC PROCEDURE setsql IF THIS.lUseSQLSyntax THIS.cSQL = "exec " + this.cSPName +" " +this.SetParams() &&SQL Server specific ELSE THIS.cSQL = "{call " + this.cSPName + "("+this.SetParams()+ ")}" ENDIF ENDPROC PROCEDURE setparams LOCAL nArrayCount,cParms cParms="" FOR nArrayCount = 1 TO ALEN (this.aParams) cParms = cParms + this.aParams[nArrayCount] IF nArrayCount <> ALEN (this.aParams) cParms= cParms + ',' ENDIF ENDFOR RETURN cParms ENDPROC PROCEDURE processerror LOCAL cMessageText DIMENSION aSQLError[5] =AERROR (aSQLError) cMessageText = aSQLError[1,2] =MESSAGEBOX (cMessageText) ENDPROC PROCEDURE getsql RETURN this.cSQL ENDPROC PROCEDURE Init * This class library is used for SQL Pass Thru and can allow you to execute stored procedures * on your host database. For example, the sample belows shows how you might want to called a stored * procedure called "UpdateAuthorName" on the database "pubs". The result set is returned to a cursor. * Sample code *!* sqldisconn(0) *!* DIME aParams[3] *!* aParams[1] = "'172-32-1176'" *!* aParams[2] = "'S'" *!* aParams[3] = "'E'" *!* hConnect = SQLCONNECT ('pubs','sa','') *!* set classlib to HOME()+"classes\utility.vcx" *!* x=createobj('ExecSP', 'UpdateAuthorName', hConnect, @aParams) *!* x.dosql() PARAMETERS cSPName, hConnectHandle, aParams, cCursorName IF PCOUNT() < 3 MESSAGEBOX(BADPARMS_LOC) RETURN .F. ENDIF DIMENSION this.aParams[1] ACOPY(aParams,this.aParams) IF NOT EMPTY (m.cSPName) this.cSPName = m.cSPName ENDIF this.hConnectHandle = m.hConnectHandle IF PCOUNT() = 3 this.cCursorName = 'sqlresult' ELSE this.cCursorName = m.cCursorName ENDIF this.SetSQL() ENDPROC PROCEDURE parsecondition LPARAMETERS cCondition, cControlSource LOCAL lcRetCondition, lcFieldName IF TYPE('cCondition') = 'C' cCondition = ALLTRIM(cCondition) ENDIF lcFieldName = SUBSTRC(cControlSource,(RATC(".",cControlSource)+1)) *!* NOTE: If you add a checkbox, radio button, or command group to *!* the form, this routine will need to be changed to handle that *!* specific datatype. IF !EMPTY(cCondition) THEN *!* If the type is Character or Memo, check to see if the *!* user has entered a complex condition (if so, take that *!* condition literally without any manipulation IF TYPE('cCondition')$ "CM" IF ("<" $ cCondition OR ; "==" $ cCondition OR ; "LIKE" $ cCondition OR ; "<>" $ cCondition OR ; "!=" $ cCondition OR ; "#" $ cCondition OR ; "=" $ cCondition OR ; ">=" $ cCondition OR ; "<=" $ cCondition OR ; ">" $ cCondition) lcRetCondition = lcFieldName + cCondition ENDIF ENDIF *!* If a complex condition wasn't found above (lcRetCondition will be empty) *!* Then we need to create the WHERE condition ourselves IF EMPTY(lcRetCondition) *!* The RATC() Functions figure out the column to compare based on the *!* controlSource of the control and any delimiters needed for the *!* datatype are added around the values (not all conditions are *!* assumed to be = when we construct them ourselves DO CASE CASE TYPE(cControlSource) $ "CM" lcRetCondition = lcFieldName + " = " + CHR(34) + cCondition + CHR(34) CASE TYPE(cControlSource) $ "DT" lcRetCondition = lcFieldName + " = {" + DTOC(cCondition) + "}" OTHERWISE lcRetCondition = lcFieldName + " = " + STR(cCondition) ENDCASE ENDIF ELSE lcRetCondition = "" ENDIF RETURN lcRetCondition ENDPROC F --x=%UGTc%C @USE IN &cCursor UCCURSORTHISNAME%C %. jC^The table alias must be specified in the controlSource property, in the format 'alias.column'.x$TCC.*TCCC.2%CC . bDTMGL.BTLTSELECT DISTINCT  FROM   INTO CURSOR cT UCSQLCALIASCCOLUMNTHIS CONTROLSOURCE ROWSOURCETYPENAME ROWSOURCEDestroy,Init1qR1A32aA!AA!AA2q )-